package au.com.acpfg.misc.spectra.peakextractor;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.knime.core.data.DataType;
/**
* Creates new panel holding one peak column.
*/
class PeakPanel extends JPanel {
/** List of peaks. */
private final JList m_peakList;
/** The intervals' model. */
private final DefaultListModel m_peakMdl;
private Component m_parent, m_peak_panel;
/**
* Create new interval panel.
*
* @param column the current column name
* @param appendColumn if a new peak column is append, otherwise the
* column is replaced
* @param parent used to refresh column list is number of bins has
* changed
* @param type the type for the spinner model
*
*/
PeakPanel(final String column, final Component parent, final Component peak_parent, final DataType type) {
super(new BorderLayout());
setBorder(BorderFactory.createTitledBorder(" Peaks to be extracted "));
m_peakMdl = new DefaultListModel();
m_peakList = new JList(m_peakMdl);
m_parent = parent;
m_peak_panel = peak_parent;
Font font = new Font("Monospaced", Font.PLAIN, 12);
m_peakList.setFont(font);
final JButton addButton = new JButton("Add");
addButton.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
int n = m_peakMdl.getSize() + 1;
m_peakMdl.addElement(new PeakItemPanel(PeakPanel.this, new PeakWindow("Peak"+n, 0.0)));
parent.validate();
parent.repaint();
}
});
final JButton removeButton = new JButton("Remove");
removeButton.addActionListener(new ActionListener() {
/**
*
*/
public void actionPerformed(final ActionEvent e) {
PeakItemPanel p = (PeakItemPanel)m_peakList
.getSelectedValue();
if (p != null) {
int i = m_peakMdl.indexOf(p);
m_peakMdl.removeElement(p);
int size = m_peakMdl.getSize();
if (size > 0) {
if (size == 1 || size == i) {
m_peakList.setSelectedIndex(size - 1);
} else {
m_peakList.setSelectedIndex(i);
}
}
parent.validate();
parent.repaint();
}
}
});
final JPanel buttonPanel = new JPanel(new GridLayout(1, 2));
buttonPanel.add(addButton);
buttonPanel.add(removeButton);
super.add(buttonPanel, BorderLayout.NORTH);
//
// editing a peak
//
final JPanel selPeak = new JPanel(new GridLayout(1, 1));
selPeak
.add(new PeakItemPanel(this));
selPeak.validate();
selPeak.repaint();
m_peakList
.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(final ListSelectionEvent e) {
selPeak.removeAll();
Object o = m_peakList.getSelectedValue();
if (o == null) {
selPeak.add(new PeakItemPanel(PeakPanel.this, new PeakWindow("Peak1", 0.0)));
} else {
selPeak.add((PeakItemPanel)o);
}
m_peak_panel.validate();
m_peak_panel.repaint();
}
});
m_peakList
.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
final JScrollPane peakScroll = new JScrollPane(m_peakList);
peakScroll.setMinimumSize(new Dimension(200, 155));
peakScroll.setPreferredSize(new Dimension(200, 155));
super.add(peakScroll, BorderLayout.CENTER);
JPanel southPanel = new JPanel(new BorderLayout());
southPanel.add(selPeak, BorderLayout.CENTER);
super.add(southPanel, BorderLayout.SOUTH);
}
/**
* @return number of peaks specified for extraction of their data
*/
public int getNumPeaks() {
return m_peakMdl.getSize();
}
/**
* @param i index for interval
* @return the interval item
*/
public PeakItemPanel getPeak(final int i) {
return (PeakItemPanel)m_peakMdl.get(i);
}
/**
* Appends the specified Peak to the list in the panel (at the end of the list)
* @param peakWindow
*/
public void add(PeakWindow peakWindow) {
assert(peakWindow != null && m_peakMdl != null);
m_peakMdl.addElement(new PeakItemPanel(this, peakWindow));
}
}